Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
프로그래머스 72411 - 메뉴 리뉴얼 문제 풀이 추가
Summary
프로그래머스 72411 메뉴 리뉴얼 문제를 백트래킹 알고리즘으로 해결하고, 문제 분석부터 알고리즘 선택, 구현까지의 전체 사고 과정을 문서화했습니다. 각 손님의 주문에서 가능한 모든 조합을 생성하여 가장 많이 주문된 조합을 찾는 문제를 백트래킹으로 모델링하여 해결했습니다.
주요 구현 내용:
O(2^M × N × C)시간 복잡도로 모든 조합을 생성하고 빈도를 카운트하는 해답 코드 작성추가된 파일:
brute-force/backtracking/programmers-72411/1.analysis.md: 문제 분석 및 해결 접근 방법 (1269줄)brute-force/backtracking/programmers-72411/2.algorithm.md: 백트래킹 적용 및 문자열 조합 특이사항 (193줄)brute-force/backtracking/programmers-72411/3.reasoning.md: 알고리즘 선택 근거 및 설계 과정 (411줄)brute-force/backtracking/programmers-72411/Main.java: 백트래킹 기반 조합 생성 및 빈도 카운트 (96줄)brute-force/backtracking/backtracking.md: 백트래킹 문서 보완 (문자열 조합 생성 유형 추가, 함수 구성 패턴 추가)주요 판단 및 구현 세부사항
1. 백트래킹 알고리즘 선택 근거
배경 및 문제 상황:
각 손님의 주문에서 가능한 모든 조합을 생성해야 하며, 조합의 크기는
course배열에 따라 동적으로 변합니다. 또한 실제 조합을 만들어서 빈도를 카운트해야 합니다.해결 방안 및 방식 선택:
백트래킹을 선택한 이유:
course = [2, 3, 4]처럼 크기가 변해도 같은 코드로 처리 가능다른 방법과의 비교:
(2중첩, 3중첩... 몇 중첩?)
(개수만 구함)
핵심 판단:
구현 코드:
고민한 점:
2. 문제 해결 접근 방법: generateCombinations 함수 설계
배경 및 문제 상황:
"ABCFG"에서 2개 조합을 어떻게 만들까요? 처음에는 막막할 수 있지만, 단계별로 생각하면 해결책이 보입니다.
해결 방안 및 사고 과정:
1단계: 문제를 작은 단위로 분해
2단계: 핵심 작업 파악
3단계: 패턴 인식
4단계: 재귀 함수로 추상화
5단계: 구체적인 함수 시그니처 설계
최종 선택:
인덱스 기반 패턴을 사용하여 함수를 설계했습니다. 전체 문자열과 인덱스를 사용하는 것이 부분 문자열을 만드는 것보다 메모리 효율적입니다.
구현 코드:
고민한 점:
3. 빈도 카운트 및 최대값 선택
배경 및 문제 상황:
각 조합이 몇 명의 손님에게서 나왔는지 카운트하고, 각 코스 크기별로 가장 많이 주문된 조합을 선택해야 합니다.
해결 방안:
Map<String, Integer>를 사용하여 각 조합의 빈도를 카운트하고, 각 코스 크기별로 최대 빈도를 찾아 선택합니다.구현 코드:
핵심 포인트:
고민한 점:
4. 문서화 구조: 문제 해결 접근 방법 강조
배경 및 문제 상황:
단순히 코드를 보는 것이 아니라, 문제를 보고 "아, 이렇게 접근해야겠다"는 생각을 어떻게 할 수 있는지 알고 싶어하는 학습자가 있습니다.
해결 방안:
1.analysis.md에 "문제 해결 접근 방법" 섹션을 추가하여,generateCombinations같은 함수를 떠올리는 사고 과정을 단계별로 설명했습니다.추가된 내용:
단계별 사고 과정
실전 팁
실제 사고 과정 예시
핵심 인사이트
고민한 점:
구현 세부사항
1. 백트래킹 조합 생성 함수 구현
핵심 로직:
current.length() == courseSize일 때 완전한 조합을 찾은 것이므로 Map에 저장하고 returnstart부터order.length()까지 각 문자를 선택current.append(order.charAt(i))로 선택generateCombinations(..., i + 1, ...)호출current.setLength(...)로 선택 취소관련 코드:
2. 인덱스 사용의 효율성
왜 부분 문자열을 전달하지 않았을까?
방법 1: 부분 문자열 전달 (비효율적)
방법 2: 인덱스 사용 (효율적)
장점:
3. 시간 복잡도 분석
조합 생성 시간 복잡도:
c인 조합을 생성하는 경우의 수는 C(M, c) (M은 주문 길이)제약 조건의 영향:
4. 공간 복잡도 분석
조합 저장 공간:
Map에 저장재귀 호출 스택:
전체 공간 복잡도: O(2^M × N) (조합 저장 공간이 지배적)